home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / games / nhak_src.zip / EXPER.C < prev    next >
C/C++ Source or Header  |  1993-03-16  |  5KB  |  203 lines

  1. /*    SCCS Id: @(#)exper.c    3.0    89/11/08
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. #ifdef LINT
  8. #define    NEW_SCORING
  9. #endif
  10. long
  11. newuexp(lev)
  12. register unsigned lev;
  13. {
  14. #ifdef LINT    /* long conversion */
  15.     return(0L * lev);
  16. #else
  17.     if(lev < 10) return (10L*(1L << lev));
  18.     if(lev < 20) return (10000L*(1L << (lev-10)));
  19.     return (10000000L*(lev-19));
  20. #endif
  21. }
  22.  
  23. int
  24. experience(mtmp, nk)    /* return # of exp points for mtmp after nk killed */
  25.     register struct    monst *mtmp;
  26.     register int    nk;
  27. {
  28.     register struct permonst *ptr = mtmp->data;
  29.     int    i, tmp, tmp2;
  30.  
  31.     tmp = 1 + mtmp->m_lev * mtmp->m_lev;
  32.  
  33. /*    For higher ac values, give extra experience */
  34.     if(ptr->ac < 3) tmp += (7 - ptr->ac) * (ptr->ac < 0) ? 2 : 1;
  35.  
  36. /*    For very fast monsters, give extra experience */
  37.     if(ptr->mmove >= 12) tmp += (ptr->mmove >= 18) ? 5 : 3;
  38.  
  39. /*    For each "special" attack type give extra experience */
  40.     for(i = 0; i < NATTK; i++) {
  41.  
  42.         tmp2 = ptr->mattk[i].aatyp;
  43.         if(tmp2 > AT_BUTT) {
  44.  
  45.         if(tmp2 == AT_WEAP) tmp += 5;
  46.         else if(tmp2 == AT_MAGC) tmp += 10;
  47.         else tmp += 3;
  48.         }
  49.     }
  50.  
  51. /*    For each "special" damage type give extra experience */
  52.     for(i = 0; i < NATTK; i++) {
  53.  
  54.         tmp2 = ptr->mattk[i].adtyp;
  55.         if(tmp2 > AD_PHYS && tmp2 < AD_BLND) tmp += 2*mtmp->m_lev;
  56.         else if((tmp2 == AD_DRLI) || (tmp2 == AD_STON)) tmp += 50;
  57.         else if(tmp != AD_PHYS) tmp += mtmp->m_lev;
  58.         /* extra heavy damage bonus */
  59.         if((ptr->mattk[i].damd * ptr->mattk[i].damn) > 23)
  60.         tmp += mtmp->m_lev;
  61.     }
  62.  
  63. /*    For certain "extra nasty" monsters, give even more */
  64.     if(extra_nasty(ptr)) tmp += (7*mtmp->m_lev);
  65.     if(ptr->mlet == S_EEL) tmp += 1000;
  66.  
  67. /*    For higher level monsters, an additional bonus is given */
  68.     if(mtmp->m_lev > 8) tmp += 50;
  69.  
  70. #ifdef NEW_SCORING
  71.     /* ------- recent addition: make nr of points decrease
  72.            when this is not the first of this kind */
  73.     { unsigned ul = u.ulevel;
  74.       int ml = mtmp->m_lev;
  75.     /* points are given based on present and future level */
  76.       if(ul < MAXULEV)
  77.         for(tmp2 = 0; !tmp2 || ul + tmp2 <= ml; tmp2++)
  78.         if(u.uexp + 1 + (tmp + ((tmp2 <= 0) ? 0 : 4<<(tmp2-1)))/nk
  79.             >= newuexp(ul) )
  80.             if(++ul == MAXULEV) break;
  81.  
  82.       tmp2 = ml - ul -1;
  83.       tmp = (tmp + ((tmp2 < 0) ? 0 : 4<<tmp2))/nk;
  84.       if(tmp <= 0) tmp = 1;
  85.     }
  86.     /* note: ul is not necessarily the future value of u.ulevel */
  87.     /* ------- end of recent valuation change ------- */
  88. #endif /* NEW_SCORING /**/
  89.  
  90. #ifdef MAIL
  91.     /* Mail daemons put up no fight. */
  92.     if(mtmp->data == &mons[PM_MAIL_DAEMON]) tmp = 1;
  93. #endif
  94.  
  95.     return(tmp);
  96. }
  97.  
  98. void
  99. more_experienced(exp, rexp)
  100.     register int exp, rexp;
  101. {
  102.     u.uexp += exp;
  103.     u.urexp += 4*exp + rexp;
  104.     if(exp) flags.botl = 1;
  105.     if(u.urexp >= ((pl_character[0] == 'W') ? 1000 : 2000))
  106.         flags.beginner = 0;
  107. }
  108.  
  109. void
  110. losexp() {    /* hit by drain life attack */
  111.  
  112.     register int num;
  113.  
  114. #ifdef POLYSELF
  115.     if(resists_drli(uasmon)) return;
  116. #endif
  117.  
  118.     if(u.ulevel > 1) {
  119.         pline("Goodbye level %u.", u.ulevel--);
  120.         /* remove intrinsic abilities */
  121.         adjabil((int)u.ulevel+1, (int)u.ulevel);
  122.     } else
  123.         u.uhp = -1;
  124.     num = newhp();
  125.     u.uhp -= num;
  126.     u.uhpmax -= num;
  127. #ifdef SPELLS
  128.     num = rnd((int)u.ulevel/2+1) + 1;        /* M. Stephenson */
  129.     u.uen -= num;
  130.     if (u.uen < 0)        u.uen = 0;
  131.     u.uenmax -= num;
  132.     if (u.uenmax < 0)    u.uenmax = 0;
  133. #endif
  134.     u.uexp = newuexp(u.ulevel) - 1;
  135.     flags.botl = 1;
  136. }
  137.  
  138. /*
  139.  * Make experience gaining similar to AD&D(tm), whereby you can at most go
  140.  * up by one level at a time, extra expr possibly helping you along.
  141.  * After all, how much real experience does one get shooting a wand of death
  142.  * at a dragon created with a wand of polymorph??
  143.  */
  144. void
  145. newexplevel() {
  146.  
  147.     register int tmp;
  148.  
  149.     if(u.ulevel < MAXULEV && u.uexp >= newuexp(u.ulevel)) {
  150.  
  151.         u.ulevel++;
  152.         if (u.uexp >= newuexp(u.ulevel)) u.uexp = newuexp(u.ulevel) - 1;
  153.         pline("Welcome to experience level %u.", u.ulevel);
  154.         set_uasmon();    /* set up for the new level. */
  155.         /* give new intrinsics */
  156.         adjabil((int)u.ulevel-1, (int)u.ulevel);
  157.         tmp = newhp();
  158.         u.uhpmax += tmp;
  159.         u.uhp += tmp;
  160. #ifdef SPELLS
  161.         tmp = rnd((int)ACURR(A_WIS)/2+1) + 1; /* M. Stephenson */
  162.         u.uenmax += tmp;
  163.         u.uen += tmp;
  164. #endif
  165.         flags.botl = 1;
  166.     }
  167. }
  168.  
  169. void
  170. pluslvl() {
  171.     register int num;
  172.  
  173.     You("feel more experienced.");
  174.     num = newhp();
  175.     u.uhpmax += num;
  176.     u.uhp += num;
  177. #ifdef SPELLS
  178.     num = rnd((int)ACURR(A_WIS)/2+1) + 1;    /* M. Stephenson */
  179.     u.uenmax += num;
  180.     u.uen += num;
  181. #endif
  182.     if(u.ulevel < MAXULEV) {
  183.         u.uexp = newuexp(u.ulevel);
  184.         pline("Welcome to experience level %u.", ++u.ulevel);
  185.         adjabil((int)u.ulevel-1, (int)u.ulevel);
  186.     }
  187.     flags.botl = 1;
  188. }
  189.  
  190. long
  191. rndexp()
  192. {
  193.     register long minexp,maxexp;
  194.  
  195.     if(u.ulevel == 1)
  196.         return rn2((int)newuexp(1));
  197.     else {
  198.         minexp = newuexp(u.ulevel - 1);
  199.         maxexp = newuexp(u.ulevel);
  200.         return(minexp + rn2((int)(maxexp - minexp)));
  201.     }
  202. }
  203.